package com.gper.edu.mytrait

/**
 * 动态混入示例2
 */
object TraitMixInDemo2 {

  def main(args: Array[String]): Unit = {
    println("测试混入特质")
    /**
     * 可以执行
     */
    val test = new TraitOperatorTest with TraitOperator3
    test.insert(30)
    /**
     * 可以执行，
     * TraitOperator2.insert方法时，会执行super.insert ,再会从左表的特质中会打是否有
     * 实现了的insert方法，
     */
    val test01 = new TraitOperatorTest with TraitOperator3 with TraitOperator2
    test01.insert(40)
    /**
     * 执行报错：
     *  在混入的时候，继承的一个冲突
     */
//    val test02 = new TraitOperatorTest with TraitOperator2 with TraitOperator3
//    test02.insert(40)

  }
}

class TraitOperatorTest{

}
trait TraitOperator{
  def insert(value: Int)
}

trait TraitOperator2 extends TraitOperator{
  /**
   * 1. 如果我们在子特质中重写/实现一个父特质的抽象方法，但同时调用super调用自己，
   * 2. 这时我们的方法不是完全实现，因此需要声明为 abstract override
   * 3. 这时super.insert(value)的调用就和动态混入的顺序有密切的关系
   * @param value
   */
  abstract override def insert(value :Int): Unit ={
    println("TraitOperator2 insert value: "+value)
    super.insert(value)
  }
}

trait TraitOperator3 extends TraitOperator{
  def insert(value: Int): Unit = {
    println("TraitOperator3 实现了 insert 方法 ："+value)
  }
}